const parser = require('@babel/parser');
const traverse = require('@babel/traverse').default;
const t = require('@babel/types');
const generator = require('@babel/generator').default;

// 辅助函数：检查字符串是否包含 \u 或 \x 转义序列
function containsEscapeSequence(str) {
    return /\\[ux][0-9A-Fa-f]{2,4}/.test(str);
}

// 辅助函数：解码十六进制和 Unicode 转义序列的字符串
function decodeEscapeSequences(str) {
    // 先处理 \x 转义序列
    let decodedStr = str.replace(/\\x([0-9A-Fa-f]{2})/g, function (match, hex) {
        return String.fromCharCode(parseInt(hex, 16));
    });

    // 再处理 \u 转义序列
    decodedStr = decodedStr.replace(/\\u([0-9A-Fa-f]{4})/g, function (match, hex) {
        return String.fromCharCode(parseInt(hex, 16));
    });

    return decodedStr;
}

// 测试代码
const code = `
  const string = ["\\x68\\x65\\x6c\\x6c\\x6f", "\\u0077\\u006f\\u0072\\u006c\\u0064"];
`;

// 解析源代码为 AST
const ast = parser.parse(code, {
    sourceType: 'module'
});

// 定义 visitor 来遍历 AST 并解码字符串字面量
const visitor = {
    StringLiteral(path) {
        const originalValue = path.node.extra.raw;
        // 检查字符串是否包含需要解码的转义序列
        if (containsEscapeSequence(originalValue)) {
            /*  获取解码后的字符串
            const decodedValue = decodeEscapeSequences(originalValue);
            if (decodedValue !== originalValue) {
                path.replaceWith(t.stringLiteral(decodedValue));
            }
            */
            path.node.extra.raw = path.node.extra.rawValue;
        }
    }
};

// 使用定义的 visitor 遍历 AST
traverse(ast, visitor);

// 将修改后的 AST 转换回代码字符串
const output = generator(ast).code;
console.log(output);